#include "RingQueue.hpp"
using namespace MyRingQueueModule;



int cnt = 1;

class RqData 
{
public:
    RqData()
    {
        _name = "thread-" + std::to_string(cnt++);
    }
    RqData(RqData& q)
    {
        _name = q._name;
    }
    std::string Name() {return _name;}
    ~RqData()
    {}
private:
    std::string _name;
};




void *product(void *args) // 消费者
{
    ringqueue<RqData> *rq = static_cast<ringqueue<RqData> *>(args);
    // 生产者

    while (true)
    {
        RqData data;
        rq->Equeue(data);
        printf("生产者成产了一个数据: %s\n",data.Name().c_str());
    }

    return nullptr;
}

void *customer(void *args)
{
    ringqueue<RqData> *rq = static_cast<ringqueue<RqData> *>(args);
    while (true)
    {
        sleep(1);

        RqData data;
        rq->Pop(&data);
        printf("消费者消费了一个数据:\n");
    }
    return nullptr;
}

int main()
{
    pthread_t c1,c2,c3;
    pthread_t p1,p2;
    ringqueue<RqData> rq(5);

    pthread_create(&c1, nullptr, customer, (void *)&rq);
    pthread_create(&c2, nullptr, customer, (void *)&rq);
    pthread_create(&c3, nullptr, customer, (void *)&rq);
    pthread_create(&p1, nullptr, product, (void *)&rq);
    pthread_create(&p2, nullptr, product, (void *)&rq);

    pthread_join(c1, nullptr);
    pthread_join(c2, nullptr);
    pthread_join(c3, nullptr);
    pthread_join(p1, nullptr);
    pthread_join(p2, nullptr);
    return 0;
}